package com.ruoyi.ljx.controller;

import org.springframework.stereotype.Component;

import java.time.LocalTime;

/**
 * @author : ljx
 * @date : 2024-12-19 09:15
 * @description :
 **/
@Component
public class DidiFareCalculator {
    // 基础费用
    private static final double BASE_FARE = 6.0;

    // 距离单价（元/公里）
    private static final double DISTANCE_RATE = 1.8;

    // 时间单价（元/分钟）
    private static final double TIME_RATE = 0.3;

    // 夜间费用（元/公里）
    private static final double NIGHT_DISTANCE_RATE = 2.5;

    // 夜间时间单价（元/分钟）
    private static final double NIGHT_TIME_RATE = 0.5;

    // 夜间开始时间
    private static final LocalTime NIGHT_START = LocalTime.of(22, 0); // 22:00

    // 夜间结束时间
    private static final LocalTime NIGHT_END = LocalTime.of(6, 0); // 06:00

    // 起步价距离（公里）
    private static final double STARTING_PRICE_DISTANCE = 3.0;

    // 起步价金额（元）
    private static final double STARTING_PRICE_AMOUNT = 10.0;

    /**
     * 计算总费用
     *
     * @param distance 驾驶距离（公里）
     * @param time 行驶时间（分钟）
     * @param waitTime 等待时间（分钟）
     * @param startTime 出发时间
     * @return 总费用
     */
    public double calculateTotalFare(double distance, int time, int waitTime, LocalTime startTime) {
        double totalFare = 0.0;

        // 是否夜间
        boolean isNight = isNight(startTime);

        // 起步价计算
        if (distance <= STARTING_PRICE_DISTANCE) {
            totalFare += STARTING_PRICE_AMOUNT;
        } else {
            totalFare += BASE_FARE;
            totalFare += (distance - STARTING_PRICE_DISTANCE) * (isNight ? NIGHT_DISTANCE_RATE : DISTANCE_RATE);
        }

        // 行驶时间费用
        totalFare += time * (isNight ? NIGHT_TIME_RATE : TIME_RATE);

        // 等待时间费用
        totalFare += waitTime * (isNight ? NIGHT_TIME_RATE : TIME_RATE);

        return totalFare;
    }

    /**
     * 判断是否为夜间
     *
     * @param startTime 出发时间
     * @return 是否为夜间
     */
    private boolean isNight(LocalTime startTime) {
        return !startTime.isAfter(NIGHT_START) || startTime.isBefore(NIGHT_END);
    }
}
